// 1. 引入 luch-request（确保已通过 npm 安装：npm i luch-request）
import Request from '@/node_modules/luch-request'

// 2. 基础配置（根据你的后端地址修改）
const BASE_API = 'http://localhost:8080'; // 后端基础地址
const TIMEOUT = 30000; // 超时时长（30秒）

// 3. 创建请求实例
const http = new Request({
	baseURL: BASE_API,
	timeout: TIMEOUT,
	// 基础header：避免同时设置 multipart/form-data 和 application/json（两者冲突）
	// 普通接口用 json，文件上传时再单独设置 form-data
	header: {
		'Content-Type': 'application/json;charset=UTF-8'
	}
});

// 4. 请求拦截器（添加token、统一配置）
http.interceptors.request.use(
	(config) => {
		// 4.1 携带token（登录后存储在缓存，未登录则不携带）
		const token = uni.getStorageSync('token');
		if (token) {
			// 合并header：保留原header（如Content-Type），只添加Authorization
			config.header = {
				...config.header, // 关键：避免覆盖基础header
				'Authorization': `Bearer ${token}`
			};
		}

		// 4.2 不需要手动序列化POST数据！luch-request会自动处理：
		// - Content-Type为json时，自动把data转成JSON字符串
		// - 若手动JSON.stringify，会导致后端收到双重序列化数据（报错）

		return config;
	},
	(error) => {
		// 请求发送前的错误（如参数错误），返回Promise便于后续捕获
		return Promise.reject("error=",error);
	}
);

// 5. 响应拦截器（统一错误处理、简化返回数据）
http.interceptors.response.use(
	(response) => {
		// 5.1 只返回后端的核心数据（跳过luch-request的外层包装）
		// 假设后端返回格式：{ code: 200, msg: "成功", data: {} }
		if(response.statusCode===200){
			return response.data;
		}else{
			uni.showToast({
				title: '登陆过期',
				duration: 1000
			});
			uni.clearStorageSync();
			// 跳转到登录页（若首页是登录页则用switchTab，否则用navigateTo）
			uni.switchTab({
				url: '/pages/log-reg/login/login' // uni-app页面路径不用加.vue后缀
			});
		}
		
	},
	(error) => {
		// 5.2 统一错误提示（用户体验优化）
		uni.showToast({
			title: error.message || '请求失败，请稍后重试',
			icon: 'none',
			duration: 2000
		});

		// 5.3 401未登录：清空缓存并跳首页（根据你的页面路径调整）
		if (error.statusCode === 401) {
			uni.clearStorageSync();
			// 跳转到登录页（若首页是登录页则用switchTab，否则用navigateTo）
			uni.switchTab({
				url: '/pages/log-reg/login/login' // uni-app页面路径不用加.vue后缀
			});
		}

		// 5.4 返回错误，便于业务层捕获处理
		return Promise.reject(error);
	}
);

// 6. 封装 GET/POST/PUT/DELETE 方法（核心：简化调用）
/**
 * GET请求
 * @param {string} url - 接口地址（如：/index/getList）
 * @param {object} params - URL参数（会拼接到url后面，如?name=xxx&age=18）
 * @param {object} config - 额外配置（如自定义header、超时时间，可选）
 * @returns {Promise} - 返回后端数据
 */
export const get = (url, params = {}, config = {}) => {
	return http.request({
		url,
		method: 'GET',
		params, // GET用params传参（luch-request会自动拼到URL）
		...config // 覆盖默认配置（如特殊接口的header）
	});
};

/**
 * POST请求（普通JSON数据）
 * @param {string} url - 接口地址
 * @param {object} data - 请求体数据（后端用@RequestBody接收）
 * @param {object} config - 额外配置（可选）
 * @returns {Promise}
 */
export const post = (url, data = {}, config = {}) => {
	return http.request({
		url,
		method: 'POST',
		data, // POST用data传参（自动转JSON）
		...config
	});
};

/**
 * PUT请求（通常用于修改数据）
 * @param {string} url - 接口地址
 * @param {object} data - 请求体数据
 * @param {object} config - 额外配置（可选）
 * @returns {Promise}
 */
export const put = (url, data = {}, config = {}) => {
	return http.request({
		url,
		method: 'PUT',
		data,
		...config
	});
};

/**
 * DELETE请求（通常用于删除数据）
 * @param {string} url - 接口地址
 * @param {object} params - URL参数（删除通常用参数传ID，如?id=123）
 * @param {object} config - 额外配置（可选）
 * @returns {Promise}
 */
export const del = (url, params = {}, config = {}) => {
	return http.request({
		url,
		method: 'DELETE',
		params,
		...config
	});
};

// 7. 导出：既可以单独用 get/post，也可以用原始 http 实例（灵活度更高）
export default http;